home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / osi / quipu / quipu-7-patch.1 < prev    next >
Text File  |  1991-11-21  |  24KB  |  832 lines

  1. Dear Camayocs,
  2.  
  3. Included below is Patch #1 for QUIPU-7.0.  
  4.  
  5. The major aim of the patch is to fix DSA reliability problems. 
  6. The fixes include:
  7.     
  8.     Fixes to prevent replicated EDB filling the Disk with garbage.    
  9.     Protocol alignment for an obsure read operation.
  10.     Test for hypothetcial deadlock case.
  11.     Fix to correctly load 'NULL' EDB files.
  12.     Fix to 'alias' indexing problem.
  13.     A fix to the X.25 handler to allow for 'quick' connections!
  14.     Fix to close the quipu.log file periodically.
  15.     Fixes to the scheduling code to increase DSA reliability.
  16.  
  17. For DUAs we have included a fix to the Quality of Service and
  18. T.61 string syntax handlers. 
  19.  
  20. The patch should be applied to the ISODE-7.0 source tree.  
  21. You will then need to re-compile ISODE and QUIPU.  To do this you
  22. should use 
  23.  
  24.     cd isode-7.0
  25.        ./make all all-quipu
  26.     su
  27.     ./make inst-all inst-quipu
  28.  
  29. And if you installed the "little" dish binaries you should do
  30.  
  31.     cd others/quipu/uips/dish
  32.     ./make all 
  33.     su
  34.     ./make inst-all
  35.  
  36.  
  37. Thanks to Paul Barker, Tim Howes, Mark Prior, Mike Roe, Thomas Lenggenhager, 
  38. George Michaelson, Oliver Wenzel, and the Giant Tortoise DSA for 
  39. helping detect and fix these bugs.
  40.  
  41. Colin
  42.  
  43.  
  44. *** /tmp/RCSAa10173    Wed Oct 23 11:39:17 1991
  45. --- tsap/tp0ts.c    Wed Oct 23 10:59:06 1991
  46. ***************
  47. *** 121,127 ****
  48.       if (t = tb -> tb_retry) {
  49.       tb -> tb_retry = NULL;
  50.   
  51. !     if (async)
  52.           switch ((*tb -> tb_retryfnx) (tb, td)) {
  53.           case NOTOK:
  54.                   goto out;
  55. --- 121,127 ----
  56.       if (t = tb -> tb_retry) {
  57.       tb -> tb_retry = NULL;
  58.   
  59. !     if (async && tb -> tb_retryfnx)
  60.           switch ((*tb -> tb_retryfnx) (tb, td)) {
  61.           case NOTOK:
  62.                   goto out;
  63. *** /tmp/RCSAa10173    Wed Oct 23 11:39:18 1991
  64. --- tsap/ts2sunlink.c    Wed Oct 23 10:58:40 1991
  65. ***************
  66. *** 175,181 ****
  67.       register struct tp4pkt *t;
  68.   
  69.       t = NULL;
  70. !     if (async)
  71.       switch ((*tb -> tb_retryfnx) (tb, td)) {
  72.           case NOTOK:
  73.               goto out;
  74. --- 175,181 ----
  75.       register struct tp4pkt *t;
  76.   
  77.       t = NULL;
  78. !     if (async && tb -> tb_retryfnx)
  79.       switch ((*tb -> tb_retryfnx) (tb, td)) {
  80.           case NOTOK:
  81.               goto out;
  82. *** /tmp/RCSAa10173    Wed Oct 23 11:39:19 1991
  83. --- tsap/ts2tcp.c    Wed Oct 23 10:57:33 1991
  84. ***************
  85. *** 189,194 ****
  86. --- 189,196 ----
  87.   #endif
  88.   #endif
  89.   
  90. +     tb -> tb_retryfnx = NULLIFP;    /* No need... */
  91.       return DONE;
  92.   }
  93.   
  94. *** /tmp/RCSAa10173    Wed Oct 23 11:39:19 1991
  95. --- tsap/ts2tli.c    Wed Oct 23 10:58:54 1991
  96. ***************
  97. *** 459,465 ****
  98.       if (tb->tb_cc == -1) { /* call not yet connected */
  99.       struct TSAPaddr ta;
  100.   
  101. !     if (async) {
  102.           switch ((*tb -> tb_retryfnx) (tb, td)) {
  103.           case NOTOK:
  104.           goto out;
  105. --- 459,465 ----
  106.       if (tb->tb_cc == -1) { /* call not yet connected */
  107.       struct TSAPaddr ta;
  108.   
  109. !     if (async && tb -> tb_retryfnx) {
  110.           switch ((*tb -> tb_retryfnx) (tb, td)) {
  111.           case NOTOK:
  112.           goto out;
  113. *** /tmp/RCSAa10173    Wed Oct 23 11:39:20 1991
  114. --- tsap/ts2x25.c    Wed Oct 23 10:57:34 1991
  115. ***************
  116. *** 146,151 ****
  117. --- 146,153 ----
  118.       (void) XTService (tb);      /* in case pktsize changed... */
  119.       LLOG (x25_log, LLOG_NOTICE,
  120.         ("connection %d to %s", fd, na2str (remote)));
  121. +     tb -> tb_retryfnx = NULLIFP;    /* No need... */
  122.   
  123.       return DONE;
  124.   }
  125.  
  126.  
  127. *** /tmp/RCSAa07079    Tue Nov 19 13:13:36 1991
  128. --- quipu/get_dsa_info.c    Tue Nov 19 13:10:00 1991
  129. ***************
  130. *** 306,313 ****
  131.           break;
  132.   
  133.       case DI_TASK:
  134. !         task_dsa_info_wakeup(di);
  135. !         di_free(di);
  136.           break;
  137.   
  138.       default:
  139. --- 306,313 ----
  140.           break;
  141.   
  142.       case DI_TASK:
  143. !         if ( task_dsa_info_wakeup(di) )
  144. !         di_free(di);
  145.           break;
  146.   
  147.       default:
  148. *** /tmp/RCSAa23005    Thu Nov 14 16:22:36 1991
  149. --- quipu/ds_read.c    Thu Nov 14 16:16:25 1991
  150. ***************
  151. *** 160,172 ****
  152.                   quipu_ctx, realtarget)) != NULLATTR)
  153.                   goto out;
  154.   
  155.               error->dse_type = DSE_ATTRIBUTEERROR;
  156.               error->ERR_ATTRIBUTE.DSE_at_name = get_copy_dn (entryptr);
  157.               error->ERR_ATTRIBUTE.DSE_at_plist.DSE_at_what =DSE_AT_NOSUCHATTRIBUTE;
  158. !             if (arg->rda_eis.eis_select != NULLATTR)
  159. !                 error->ERR_ATTRIBUTE.DSE_at_plist.DSE_at_type = AttrT_cpy(arg->rda_eis.eis_select->attr_type);
  160. !             else
  161. !                 error->ERR_ATTRIBUTE.DSE_at_plist.DSE_at_type = NULLAttrT;
  162.               error->ERR_ATTRIBUTE.DSE_at_plist.DSE_at_value = NULLAttrV;
  163.               error->ERR_ATTRIBUTE.DSE_at_plist.dse_at_next = DSE_AT_NOPROBLEM;
  164.               dn_free (realtarget);
  165. --- 160,174 ----
  166.                   quipu_ctx, realtarget)) != NULLATTR)
  167.                   goto out;
  168.   
  169. +             if (arg->rda_eis.eis_select == NULLATTR)
  170. +                 goto out;
  171.               error->dse_type = DSE_ATTRIBUTEERROR;
  172.               error->ERR_ATTRIBUTE.DSE_at_name = get_copy_dn (entryptr);
  173.               error->ERR_ATTRIBUTE.DSE_at_plist.DSE_at_what =DSE_AT_NOSUCHATTRIBUTE;
  174. !             error->ERR_ATTRIBUTE.DSE_at_plist.DSE_at_type = 
  175. !                     AttrT_cpy(arg->rda_eis.eis_select->attr_type);
  176.               error->ERR_ATTRIBUTE.DSE_at_plist.DSE_at_value = NULLAttrV;
  177.               error->ERR_ATTRIBUTE.DSE_at_plist.dse_at_next = DSE_AT_NOPROBLEM;
  178.               dn_free (realtarget);
  179. ***************
  180. *** 206,219 ****
  181.       }
  182.   
  183.       if ((result->rdr_entry.ent_attr = eis_select (arg->rda_eis,entryptr, dsp ? NULLDN : binddn, quipu_ctx, realtarget)) == NULLATTR)
  184. !         if (! arg->rda_eis.eis_allattributes) {
  185.               error->dse_type = DSE_ATTRIBUTEERROR;
  186.                           error->ERR_ATTRIBUTE.DSE_at_name = get_copy_dn (entryptr);
  187.                           error->ERR_ATTRIBUTE.DSE_at_plist.DSE_at_what =DSE_AT_NOSUCHATTRIBUTE;
  188. !             if (arg->rda_eis.eis_select != NULLATTR)
  189. !                             error->ERR_ATTRIBUTE.DSE_at_plist.DSE_at_type = AttrT_cpy(arg->rda_eis.eis_select->attr_type);
  190. !             else
  191. !                             error->ERR_ATTRIBUTE.DSE_at_plist.DSE_at_type = NULLAttrT;
  192.                           error->ERR_ATTRIBUTE.DSE_at_plist.DSE_at_value = NULLAttrV;
  193.                           error->ERR_ATTRIBUTE.DSE_at_plist.dse_at_next = DSE_AT_NOPROBLEM;
  194.               dn_free (realtarget);
  195. --- 208,220 ----
  196.       }
  197.   
  198.       if ((result->rdr_entry.ent_attr = eis_select (arg->rda_eis,entryptr, dsp ? NULLDN : binddn, quipu_ctx, realtarget)) == NULLATTR)
  199. !         if ((! arg->rda_eis.eis_allattributes) && arg->rda_eis.eis_select) {
  200.               error->dse_type = DSE_ATTRIBUTEERROR;
  201.                           error->ERR_ATTRIBUTE.DSE_at_name = get_copy_dn (entryptr);
  202.                           error->ERR_ATTRIBUTE.DSE_at_plist.DSE_at_what =DSE_AT_NOSUCHATTRIBUTE;
  203. !                     error->ERR_ATTRIBUTE.DSE_at_plist.DSE_at_type = 
  204. !                 AttrT_cpy(arg->rda_eis.eis_select->attr_type);
  205.                           error->ERR_ATTRIBUTE.DSE_at_plist.DSE_at_value = NULLAttrV;
  206.                           error->ERR_ATTRIBUTE.DSE_at_plist.dse_at_next = DSE_AT_NOPROBLEM;
  207.               dn_free (realtarget);
  208.  
  209.  
  210.  
  211. *** /tmp/RCSAa11110    Thu Oct 17 14:15:48 1991
  212. --- quipu/shadow.c    Thu Oct 17 13:51:18 1991
  213. ***************
  214. *** 58,64 ****
  215.   extern AttributeType at_xref;
  216.   extern AttributeType at_nssr;
  217.   extern AttributeType at_objectclass;
  218. - extern Attr_Sequence cpy_as_comp();
  219.   extern short syntax_dn;
  220.   
  221.   typedef struct _atlist {
  222. --- 58,63 ----
  223. ***************
  224. *** 357,363 ****
  225.                           "external reference missing"));
  226.               return;
  227.           }
  228. !         new_as = as_merge (new_as, cpy_as_comp (as));
  229.   
  230.           if ((as = as_find_type (new_as, at_objectclass)) == NULLATTR) {
  231.               LLOG (log_dsap, LLOG_EXCEPTIONS, (
  232. --- 356,362 ----
  233.                           "external reference missing"));
  234.               return;
  235.           }
  236. !         new_as = as_merge (new_as, as_comp_cpy (as));
  237.   
  238.           if ((as = as_find_type (new_as, at_objectclass)) == NULLATTR) {
  239.               LLOG (log_dsap, LLOG_EXCEPTIONS, (
  240.  
  241.  
  242.  
  243. *** /tmp/RCSAa02760    Mon Oct 14 12:47:21 1991
  244. --- dsap/common/qos.c    Mon Oct 14 12:46:55 1991
  245. ***************
  246. *** 354,362 ****
  247.       }
  248.       attrQoS_print (ps, p -> dit_quality, format);
  249.       }
  250. !     if (a -> dit_description)
  251. !     ps_printf (ps, format == READOUT ? "\n%*s(%s)" : " # %s",
  252. !            a -> dit_description, qos_indent, "");
  253.   }
  254.   
  255.   static struct attrQoS *str2attrQoS (str)
  256. --- 359,371 ----
  257.       }
  258.       attrQoS_print (ps, p -> dit_quality, format);
  259.       }
  260. !     if (a -> dit_description) {
  261. !     if (format == READOUT)
  262. !         ps_printf (ps, "\n%*s(%s)", qos_indent, 
  263. !            a -> dit_description);
  264. !     else
  265. !         ps_printf (ps, " # %s", a -> dit_description);
  266. !     }
  267.   }
  268.   
  269.   static struct attrQoS *str2attrQoS (str)
  270.  
  271.  
  272. *** /tmp/RCSAa24516    Thu Nov  7 10:35:20 1991
  273. --- dsap/common/string.c    Thu Nov  7 10:34:55 1991
  274. ***************
  275. *** 88,101 ****
  276.       0xe5, '?', '?', '?', '?', '?', '?', '?', '?', 
  277.   
  278.   /* Diaresis upper case */
  279. !     0xc4, '?', 0xc9, 0xcd, '?', 0xd3, 0xda, 0x82, 
  280.   /* Diaresis lower case */
  281. !     0xe4, '?', 0xe9, 0xed, '?', 0xf3, 0xfa, 0xff, '"', 
  282.   
  283.   /* Umlaut upper case */
  284. !     0xc4, '?', 0xc9, 0xcd, '?', 0xd3, 0xda, 0x82,  
  285.   /* Umlaut lower case */
  286. !     0xe4, '?', 0xe9, 0xed, '?', 0xf3, 0xfa, 0xff, '"', 
  287.   
  288.   /* Ring upper case */
  289.       0xc5, '?', '?', '?', '?', '?', '?', '?', 
  290. --- 94,107 ----
  291.       0xe5, '?', '?', '?', '?', '?', '?', '?', '?', 
  292.   
  293.   /* Diaresis upper case */
  294. !         0xc4, '?', 0xcb, 0xcf, '?', 0xd6, 0xdc, 0x82,
  295.   /* Diaresis lower case */
  296. !         0xe4, '?', 0xeb, 0xef, '?', 0xf6, 0xfc, 0xff, '"',
  297.   
  298.   /* Umlaut upper case */
  299. !         0xc4, '?', 0xcb, 0xcf, '?', 0xd6, 0xdc, 0x82,
  300.   /* Umlaut lower case */
  301. !         0xe4, '?', 0xeb, 0xef, '?', 0xf6, 0xfc, 0xff, '"',
  302.   
  303.   /* Ring upper case */
  304.       0xc5, '?', '?', '?', '?', '?', '?', '?', 
  305. ***************
  306. *** 113,121 ****
  307.       '?', '?', '?', '?', '?', '?', '?', '?',  '_', 
  308.   
  309.   /* Umlaut upper case */
  310. !     0xc4, '?', 0xc9, 0xcd, '?', 0xd3, 0xda, 0x82,
  311.   /* Umlaut lower case */
  312. !     0xe4, '?', 0xe9, 0xed, '?', 0xf3, 0xfa, 0xff, '"', 
  313.   
  314.   /* Cedilla? upper case */
  315.       '?', 0xc7, '?', '?', '?', '?', '?', '?',
  316. --- 119,127 ----
  317.       '?', '?', '?', '?', '?', '?', '?', '?',  '_', 
  318.   
  319.   /* Umlaut upper case */
  320. !         0xc4, '?', 0xcb, 0xcf, '?', 0xd6, 0xdc, 0x82,
  321.   /* Umlaut lower case */
  322. !         0xe4, '?', 0xeb, 0xef, '?', 0xf6, 0xfc, 0xff, '"',
  323.   
  324.   /* Cedilla? upper case */
  325.       '?', 0xc7, '?', '?', '?', '?', '?', '?',
  326.  
  327.  
  328. *** /tmp/RCSAa23601    Thu Aug 22 13:09:42 1991
  329. --- quipu/conn_retry.c    Thu Aug 22 13:06:38 1991
  330. ***************
  331. *** 41,46 ****
  332. --- 41,48 ----
  333.   
  334.   struct connection    * conn_alloc();
  335.   
  336. + static test_deadlock();
  337.   /*
  338.   * Deal with an incoming acceptance of association establishment.
  339.   * Return value says whether anything has happened or not.
  340. ***************
  341. *** 123,129 ****
  342.           /* See if there is another DSA to try... */
  343.           if ((on->on_state != ON_ABANDONED) && (on->on_dsas != NULL_DI_BLOCK)) {    
  344.               LLOG (log_dsap,LLOG_NOTICE,("Trying a different DSA (NOTOK)..."));
  345. !             if (oper_chain (on) == OK) {
  346.                   if (ont == NULLOPER)
  347.                       conn->cn_operlist = onext;
  348.                   else
  349. --- 125,132 ----
  350.           /* See if there is another DSA to try... */
  351.           if ((on->on_state != ON_ABANDONED) && (on->on_dsas != NULL_DI_BLOCK)) {    
  352.               LLOG (log_dsap,LLOG_NOTICE,("Trying a different DSA (NOTOK)..."));
  353. !             if ((test_deadlock(on) == OK) &&
  354. !                (oper_chain (on) == OK)) {
  355.                   if (ont == NULLOPER)
  356.                       conn->cn_operlist = onext;
  357.                   else
  358. ***************
  359. *** 137,143 ****
  360.           }
  361.           conn_extract(conn);
  362.       break;
  363.       case DONE :
  364.           DLOG (log_dsap,LLOG_NOTICE,( "D-BIND.RETRY DONE (%d)",conn->cn_ad));
  365.           if( (conn->cn_ad == NOTOK) || (conn_req_aux(conn) != OK))
  366. --- 140,146 ----
  367.           }
  368.           conn_extract(conn);
  369.       break;
  370. !         
  371.       case DONE :
  372.           DLOG (log_dsap,LLOG_NOTICE,( "D-BIND.RETRY DONE (%d)",conn->cn_ad));
  373.           if( (conn->cn_ad == NOTOK) || (conn_req_aux(conn) != OK))
  374. ***************
  375. *** 153,159 ****
  376.               /* See if there is another DSA to try... */
  377.               if ((on->on_state != ON_ABANDONED) && (on->on_dsas != NULL_DI_BLOCK)) {    
  378.                   LLOG (log_dsap,LLOG_NOTICE,("Trying a different DSA (DONE)..."));
  379. !                 if (oper_chain (on) == OK) {
  380.                       if (ont == NULLOPER)
  381.                           conn->cn_operlist = onext;
  382.                       else
  383. --- 156,163 ----
  384.               /* See if there is another DSA to try... */
  385.               if ((on->on_state != ON_ABANDONED) && (on->on_dsas != NULL_DI_BLOCK)) {    
  386.                   LLOG (log_dsap,LLOG_NOTICE,("Trying a different DSA (DONE)..."));
  387. !                 if ((test_deadlock(on) == OK) &&
  388. !                    (oper_chain (on) == OK)) {
  389.                       if (ont == NULLOPER)
  390.                           conn->cn_operlist = onext;
  391.                       else
  392. ***************
  393. *** 195,198 ****
  394. --- 199,241 ----
  395.   
  396.       if (pstate != conn->cn_state)
  397.       conn->cn_last_used = timenow;
  398. + }
  399. + static test_deadlock (on)
  400. + struct oper_act    * on;
  401. + {
  402. + struct di_block    * di;
  403. + register int ndi = 0;
  404. +     for (di= on -> on_dsas; di!= NULL_DI_BLOCK; di= di -> di_next) 
  405. +         ndi++;
  406. +     /* To proceed, we need to contact on_dsas. */
  407. +     /* Check they do not rely on the conn that has just failed */
  408. +     /* Possibly a better way of testing this... */
  409. +     for (di= on -> on_dsas; di!= NULL_DI_BLOCK; di= di -> di_next) 
  410. +         if (( di-> di_state == DI_DEFERRED ) &&
  411. +             ( di-> di_perform ) &&
  412. +             ( di-> di_perform-> on_conn ))
  413. +             switch (di-> di_perform-> on_conn-> cn_state) {
  414. +                 case 0:
  415. +                 case CN_FAILED:
  416. +                 ndi--;
  417. +             }
  418. +     if (ndi != 0)
  419. +         return OK;
  420. +     
  421. +     if (on -> on_task) {    
  422. +         on -> on_task -> tk_resp.di_error.de_err.dse_type =
  423. +             DSE_SERVICEERROR;
  424. +         on -> on_task -> 
  425. +             tk_resp.di_error.de_err.ERR_SERVICE.DSE_sv_problem =
  426. +             DSE_SV_UNABLETOPROCEED;
  427. +     }
  428. +     
  429. +     return NOTOK;
  430.   }
  431. *** /tmp/RCSAa23601    Thu Aug 22 13:09:42 1991
  432. --- quipu/get_dsa_info.c    Thu Aug 22 11:10:31 1991
  433. ***************
  434. *** 61,66 ****
  435. --- 61,67 ----
  436.       struct di_block    * di_lookup;
  437.       struct oper_act    * on = NULLOPER;
  438.       int           res;
  439. +     Entry          te = NULLENTRY;
  440.   
  441.       DLOG (log_dsap,LLOG_TRACE,("get_dsa_info()"));
  442.   
  443. ***************
  444. *** 115,132 ****
  445.       }
  446.       }
  447.   
  448. !     if ((res = really_find_entry(dn, TRUE, dn_stack, FALSE, &((*di_p)->di_entry), err, &(di_lookup))) == DS_OK) 
  449.       /* is it really OK ??? */
  450. !     if (((*di_p)->di_entry ->e_data == E_TYPE_CONSTRUCTOR) 
  451. !         || ((*di_p)->di_entry->e_dsainfo == NULL)
  452. !         || ((*di_p)->di_entry->e_dsainfo->dsa_addr == NULLPA)) {
  453.           DN dn_found;
  454.           DLOG(log_dsap, LLOG_NOTICE, ("rfe returned a constructor"));
  455. !         dn_found = get_copy_dn((*di_p)->di_entry);
  456. !         res = constructor_dsa_info(dn_found,dn_stack,FALSE,(*di_p)->di_entry,err,&(di_lookup));
  457.           dn_free (dn_found);
  458. !     } else
  459.           (*di_p)->di_entry->e_refcount++;
  460.   
  461.       switch (res)
  462.       {
  463. --- 116,137 ----
  464.       }
  465.       }
  466.   
  467. !     if ((res = really_find_entry(dn, TRUE, dn_stack, FALSE, &te, 
  468. !                 err, &(di_lookup))) == DS_OK) 
  469.       /* is it really OK ??? */
  470. !     if ((te->e_data == E_TYPE_CONSTRUCTOR) 
  471. !         || (te->e_dsainfo == NULL)
  472. !         || (te->e_dsainfo->dsa_addr == NULLPA)) {
  473.           DN dn_found;
  474.           DLOG(log_dsap, LLOG_NOTICE, ("rfe returned a constructor"));
  475. !         dn_found = get_copy_dn(te);
  476. !         res = constructor_dsa_info(dn_found, dn_stack, FALSE, te,
  477. !                        err, &(di_lookup));
  478.           dn_free (dn_found);
  479. !     } else {
  480. !         (*di_p)->di_entry = te;
  481.           (*di_p)->di_entry->e_refcount++;
  482. +     }
  483.   
  484.       switch (res)
  485.       {
  486. *** /tmp/RCSAa23601    Thu Aug 22 13:09:42 1991
  487. --- quipu/di_block.c    Thu Aug 22 09:19:15 1991
  488. ***************
  489. *** 49,54 ****
  490. --- 49,59 ----
  491.   struct di_block *di;
  492.   {
  493.       DLOG(log_dsap, LLOG_TRACE, ("di_free()"));
  494. +     if (di->di_state == -1) {
  495. +         LLOG (log_dsap,LLOG_EXCEPTIONS, ("duplicate di_free"));
  496. +         return;
  497. +     }
  498.   
  499.       switch (di->di_type) {
  500.         case DI_GLOBAL:     break;
  501.  
  502.  
  503.  
  504. *** /tmp/RCSAa16265    Wed Aug 21 15:59:06 1991
  505. --- quipu/entry_load.c    Wed Aug 21 15:37:27 1991
  506. ***************
  507. *** 362,370 ****
  508.   
  509.           if (file_check(offset, e) == OK) {
  510.                   if ((e->e_children = getentry_block(e, filename)) == NULLAVL) {
  511.               if (e->e_allchildrenpresent != FALSE &&
  512.                   e->e_leaf == FALSE) {
  513. -                 e->e_allchildrenpresent = FALSE;
  514.                   got_all = FALSE;
  515.                   return(OK);
  516.               } else
  517. --- 362,372 ----
  518.   
  519.           if (file_check(offset, e) == OK) {
  520.                   if ((e->e_children = getentry_block(e, filename)) == NULLAVL) {
  521. +             if (parse_status != 0)
  522. +                 return(NOTOK);
  523.               if (e->e_allchildrenpresent != FALSE &&
  524.                   e->e_leaf == FALSE) {
  525.                   got_all = FALSE;
  526.                   return(OK);
  527.               } else
  528. *** dsap/common/_turbo_index.c    Tue Aug 13 13:06:57 1991
  529. --- dsap/common/turbo_index.c    Tue Aug 13 13:07:27 1991
  530. ***************
  531. *** 472,477 ****
  532. --- 472,478 ----
  533.       for ( j = i + 1; pindex->i_nonlocalaliases[ j ]; j++ )
  534.           pindex->i_nonlocalaliases[ j - 1 ] =
  535.               pindex->i_nonlocalaliases[ j ];
  536. +     pindex->i_nonlocalaliases[ j - 1 ] = NULLENTRY;
  537.   
  538.       return;
  539.   }
  540. *** dsap/common/_attribute.c    Mon Aug 12 19:11:30 1991
  541. --- dsap/common/attribute.c    Mon Aug 12 19:11:54 1991
  542. ***************
  543. *** 199,204 ****
  544. --- 199,206 ----
  545.              if (acl->ac_default == NULLACL_INFO)
  546.                  acl->ac_default = acl_default ();
  547.               }
  548. +     } else {
  549. +         eptr->e_acl = NULLACL;
  550.       }
  551.   
  552.       if (as = entry_find_type (eptr,at_edbinfo)) {
  553. *** dsap/common/attribute.c~    Wed Jul 17 12:25:03 1991
  554. --- dsap/common/attribute.c    Mon Aug 12 15:35:30 1991
  555. ***************
  556. *** 368,373 ****
  557. --- 371,377 ----
  558.                      || (AttrT_cmp (as->attr_type,at_alias) == 0)
  559.                      || (AttrT_cmp (as->attr_type,at_inherit) == 0)) {
  560.                       LLOG(log_dsap,LLOG_EXCEPTIONS,("Inherited system attribute only allowed in default case"));
  561. +                     error->dse_type = DSE_ATTRIBUTEERROR;
  562.                       error->ERR_ATTRIBUTE.DSE_at_name = get_copy_dn (eptr);
  563.                       error->ERR_ATTRIBUTE.DSE_at_plist.DSE_at_what =DSE_AT_CONSTRAINTVIOLATION;
  564.                       error->ERR_ATTRIBUTE.DSE_at_plist.DSE_at_type = AttrT_cpy (as->attr_type);
  565. ***************
  566. *** 379,384 ****
  567. --- 383,389 ----
  568.                   if (as->attr_value == NULLAV) {
  569.                       if ((nas = entry_find_type (eptr,as->attr_type)) == NULLATTR) {
  570.                           LLOG(log_dsap,LLOG_EXCEPTIONS,("Value missing for always inherited attribute type"));
  571. +                             error->dse_type = DSE_ATTRIBUTEERROR;
  572.                           error->ERR_ATTRIBUTE.DSE_at_name = get_copy_dn (eptr);
  573.                           error->ERR_ATTRIBUTE.DSE_at_plist.DSE_at_what =DSE_AT_NOSUCHATTRIBUTE;
  574.                           error->ERR_ATTRIBUTE.DSE_at_plist.DSE_at_type = AttrT_cpy (as->attr_type);
  575. ***************
  576. *** 394,399 ****
  577. --- 399,405 ----
  578.                   if (as->attr_value == NULLAV) {
  579.                       if ((nas = entry_find_type (eptr,as->attr_type)) == NULLATTR) {
  580.                           LLOG(log_dsap,LLOG_EXCEPTIONS,("Value missing for default inherited attribute type"));
  581. +                             error->dse_type = DSE_ATTRIBUTEERROR;
  582.                           error->ERR_ATTRIBUTE.DSE_at_name = get_copy_dn (eptr);
  583.                           error->ERR_ATTRIBUTE.DSE_at_plist.DSE_at_what =DSE_AT_NOSUCHATTRIBUTE;
  584.                           error->ERR_ATTRIBUTE.DSE_at_plist.DSE_at_type = AttrT_cpy (as->attr_type);
  585.  
  586. *** /tmp/RCSAa27974    Thu Nov 21 13:36:17 1991
  587. --- dsap/x500as/af.py    Thu Nov 21 13:35:40 1991
  588. ***************
  589. *** 88,93 ****
  590. --- 88,99 ----
  591.           ANY [[a asn]]
  592.               OPTIONAL
  593.       }
  594. +     %D{
  595. +         if ((*parm)->asn == NULLPE)
  596. +             (*parm)->p_type = ALG_PARM_ABSENT;
  597. +         else
  598. +             (*parm)->p_type = ALG_PARM_UNKNOWN;
  599. +     %}
  600.   
  601.   SubjectPublicKeyInfo [[P struct key_info *]]
  602.       ::=
  603. *** dsap/common/_cpair.c       Wed Jul 17 12:25:16 1991
  604. --- dsap/common/cpair.c    Tue Sep 17 14:41:19 1991
  605. ***************
  606. *** 92,98 ****
  607.     str = ptr;
  608.     if ((str != NULLCP) && (index(str, '#') != NULLCP))
  609.     {
  610. !     result->cert = str2cert(str);
  611.       if (result->cert == (struct certificate *) 0)
  612.       {
  613.         free((char *) result);
  614. --- 92,98 ----
  615.     str = ptr;
  616.     if ((str != NULLCP) && (index(str, '#') != NULLCP))
  617.     {
  618. !     result->reverse = str2cert(str);
  619.       if (result->cert == (struct certificate *) 0)
  620.       {
  621.         free((char *) result);
  622.  
  623.  
  624. *** /tmp/RCSAa23032    Thu Nov 21 09:06:53 1991
  625. --- quipu/task_select.c    Thu Nov 21 09:06:27 1991
  626. ***************
  627. *** 40,45 ****
  628. --- 40,54 ----
  629.   time_t lastedb_update;
  630.   struct oper_act * pending_ops = NULLOPER;
  631.   
  632. + #ifndef NO_STATS
  633. + extern LLog * log_stat;
  634. + static time_t last_log_close = (time_t)0;
  635. + #define LOGOPENTIME 60*60    /* Close once every 60 minutes */
  636. + #endif
  637.   struct task_act    * task_select(secs_p)
  638.   int        * secs_p;
  639.   {
  640. ***************
  641. *** 437,442 ****
  642. --- 446,462 ----
  643.           (*secs_p) = 0;    /* let connection be re-used */
  644.          }
  645.       }
  646. + #ifndef NO_STATS
  647. +     if ( (timenow - last_log_close) >= LOGOPENTIME ) {
  648. +     ll_close (log_stat);
  649. +     last_log_close = timenow;
  650. +     } else {
  651. +     if ( (ret_tk == NULLTASK) && (*secs_p >= LOGOPENTIME))
  652. +         *secs_p = LOGOPENTIME;    /* Wake to close log! */
  653. +     }
  654. + #endif
  655.   
  656.       return(ret_tk);
  657.   }
  658. *** /tmp/RCSAa23069    Thu Nov 21 09:16:46 1991
  659. --- dsap/common/entry.c    Thu Nov 21 09:15:01 1991
  660. ***************
  661. *** 36,41 ****
  662. --- 36,46 ----
  663.   AttributeType at_alias;
  664.   AttributeType at_objectclass;
  665.   
  666. + extern int local_master_size;
  667. + extern int local_slave_size;
  668. + extern int local_cache_size;
  669.   directory_free (directory)
  670.   Entry directory;
  671.   {
  672. ***************
  673. *** 47,52 ****
  674. --- 52,67 ----
  675.   
  676.           if (directory->e_children != NULLAVL)
  677.               (void) avl_free(directory->e_children, directory_free);
  678. +         switch (directory->e_data) {
  679. +         case E_TYPE_SLAVE:
  680. +             local_slave_size--; break;
  681. +         case E_DATA_MASTER:
  682. +             local_master_size--; break;
  683. +         case E_TYPE_CACHE_FROM_MASTER:
  684. +             local_cache_size--; break;
  685. +         }
  686.           entry_free(directory);
  687.       }
  688.   }
  689. *** /tmp/RCSAa28299    Thu Nov 21 15:45:25 1991
  690. --- quipu/dsa_chain.c    Thu Nov 21 15:43:54 1991
  691. ***************
  692. *** 995,1002 ****
  693.       */
  694.       sort_dsa_list (&di);
  695.   
  696. !     if (tk == NULLTASK)
  697. !     return;        /* already done it ! */
  698.   
  699.       if(di2cref(di, &(tk->tk_resp.di_error.de_err), tk->tk_conn->cn_ctx) != OK)
  700.       {
  701. --- 995,1006 ----
  702.       */
  703.       sort_dsa_list (&di);
  704.   
  705. !     if (tk == NULLTASK) {
  706. !     if (di->di_oper == NULLOPER)
  707. !         return FALSE;
  708. !     else
  709. !         return TRUE;
  710. !     }
  711.   
  712.       if(di2cref(di, &(tk->tk_resp.di_error.de_err), tk->tk_conn->cn_ctx) != OK)
  713.       {
  714. ***************
  715. *** 1010,1023 ****
  716.           task_conn_extract(tk);
  717.           task_error(tk);
  718.           task_extract(tk);
  719. !         return;
  720.       }
  721. !     return;
  722.       }
  723.   
  724.       task_conn_extract(tk);
  725.       task_error(tk);
  726.       task_extract(tk);
  727.   }
  728.   
  729.   static struct access_point * di2ap (di)
  730. --- 1014,1029 ----
  731.           task_conn_extract(tk);
  732.           task_error(tk);
  733.           task_extract(tk);
  734. !         return TRUE;
  735.       }
  736. !     return TRUE;
  737.       }
  738.   
  739.       task_conn_extract(tk);
  740.       task_error(tk);
  741.       task_extract(tk);
  742. +     return TRUE;
  743.   }
  744.   
  745.   static struct access_point * di2ap (di)
  746. *** /tmp/RCSAa01769    Fri Nov 22 09:37:56 1991
  747. --- others/quipu/uips/dish/Makefile    Fri Nov 22 09:35:04 1991
  748. ***************
  749. *** 154,162 ****
  750.           -@ls -gls $@
  751.           -@echo ""
  752.   
  753.   xquipurc:    quipurc.o $(LIBES)
  754.           $(LDCC) $(LDFLAGS) -o $@ quipurc.o \
  755. !             $(LIBDSAP) $(LIBISODE) $(LSOCKET) $(LIBGDBM)
  756.   
  757.   l-quipurc:;    $(LINT) $(LFLAGS) quipurc.c $(LLIBS) \
  758.               | grep -v "warning: possible pointer alignment problem"
  759. --- 154,165 ----
  760.           -@ls -gls $@
  761.           -@echo ""
  762.   
  763. + # Don't use shared libs for xquipurc.
  764.   xquipurc:    quipurc.o $(LIBES)
  765.           $(LDCC) $(LDFLAGS) -o $@ quipurc.o \
  766. !             $(TOPDIR)libdsap.a $(TOPDIR)libisode.a \
  767. !             $(LSOCKET) $(LIBGDBM)
  768.   
  769.   l-quipurc:;    $(LINT) $(LFLAGS) quipurc.c $(LLIBS) \
  770.               | grep -v "warning: possible pointer alignment problem"
  771. *** /tmp/RCSAa23166    Thu Nov 21 09:36:21 1991
  772. --- dsap/oidtable.oc    Fri Aug 23 08:40:19 1991
  773. ***************
  774. *** 156,164 ****
  775.   
  776.   pilotDSA:     pilotObjectClass.21 : dsa : dSAQuality : 
  777.   
  778. ! qualityLabelledData:     pilotObjectClass.22 : top : dSAQuality : \
  779.       subtreeMinimumQuality, subtreeMaximumQuality
  780.   
  781.   # QUIPU defined object classes
  782.   
  783.   quipuDSA:        quipuObjectClass.1 : dSA : \
  784. --- 162,174 ----
  785.   
  786.   pilotDSA:     pilotObjectClass.21 : dsa : dSAQuality : 
  787.   
  788. ! # Retired - wrong mandatory attribute
  789. ! oldQualityLabelledData:     pilotObjectClass.22 : top : dSAQuality : \
  790.       subtreeMinimumQuality, subtreeMaximumQuality
  791.   
  792. + qualityLabelledData:     pilotObjectClass.23 : top : singleLevelQuality : \
  793. +     subtreeMinimumQuality, subtreeMaximumQuality
  794.   # QUIPU defined object classes
  795.   
  796.   quipuDSA:        quipuObjectClass.1 : dSA : \
  797. *** /tmp/patchlevel    Thu Nov 21 15:56:54 1991
  798. --- quipu/patchlevel    Thu Nov 21 15:56:12 1991
  799. ***************
  800. *** 0 ****
  801. --- 1,1 ----
  802. + 1:Thu Nov 21 15:56:12 GMT 1991
  803.